/*
 * @file Liberay.h
 * @author JY 
 * @date 2025-04-07
 * @version v2.0
 * @brif  图书馆管理系统
 * 
 * @attention
 *   注意：
 *      本文档只供学习，请勿用于商业用途
 * 
 * 
 */
#ifndef __Liberay_H__
#define __Liberay_H__

//(1)其他头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <stdbool.h>

//(2)数据类型定义（定义有数据和和指针的节点结构体）

// 图书状态枚举
typedef enum {
    AVAILABLE,      // 可借阅
    BORROWED,       // 已借出
    RESERVED,       // 已预约
    UNDER_REPAIR    // 维修中
} BookStatus;

// 图书结构体
typedef struct Book {
    char id[20];            // 图书编号
    char title[100];        // 书名
    char author[50];        // 作者
    char publisher[50];     // 出版社
    char isbn[20];          // ISBN号
    int publish_year;       // 出版年份
    char category[30];      // 分类
    float price;            // 价格
    BookStatus status;      // 图书状态
    
    int total_copies;       // 总数量
    int available_copies;   // 可借数量
    
    struct Book *prev;      // 前驱指针
    struct Book *next;      // 后继指针
} Book;

// 读者结构体
typedef struct Reader {
    char id[20];            // 读者ID
    char name[50];          // 姓名
    char gender[10];        // 性别
    char phone[15];         // 电话
    char email[50];         // 邮箱
    char address[100];      // 地址
    time_t register_date;   // 注册日期
    int max_borrow;         // 最大借阅量
    int current_borrow;     // 当前借阅量
    
    struct Reader *prev;    // 前驱指针
    struct Reader *next;    // 后继指针
} Reader;

// 借阅记录结构体
typedef struct BorrowRecord {
    char record_id[30];     // 记录ID
    char book_id[20];       // 图书ID
    char reader_id[20];     // 读者ID
    time_t borrow_date;     // 借出日期
    time_t due_date;        // 应还日期
    time_t return_date;     // 实际归还日期(未归还时为0)
    float fine;             // 罚款金额
    
    struct BorrowRecord *prev;  // 前驱指针
    struct BorrowRecord *next;  // 后继指针
} BorrowRecord;

// 图书馆管理系统
typedef struct {
    Book *book_head;            // 图书链表头指针
    int book_count;             // 图书数量
    
    Reader *reader_head;        // 读者链表头指针
    int reader_count;           // 读者数量
    
    BorrowRecord *record_head;  // 借阅记录链表头指针
    int record_count;           // 记录数量
} LibrarySystem;

// 函数声明
void init_library(LibrarySystem *lib);                                  //初始化
void add_book(LibrarySystem *lib, Book book);                           //添加图书到双向循环链表(尾插法)
void delete_book(LibrarySystem *lib, char *book_id);                    //删除图书（根据编号ID删除）
Book* search_book(LibrarySystem *lib, char *keyword);                   //查询书籍
void add_reader(LibrarySystem *lib, Reader reader);                     //添加读者
void delete_reader(LibrarySystem *lib, char *reader_id);                // 删除读者
Reader* search_reader(LibrarySystem *lib, char *keyword);               // 搜索读者
void borrow_book(LibrarySystem *lib, char *book_id, char *reader_id);   // 借书
void return_book(LibrarySystem *lib, char *record_id);                  //还书
bool Password();
// void save_to_file(LibrarySystem *lib, const char *filename);            // 保存数据到文件
// void load_from_file(LibrarySystem *lib, const char *filename);          // 从文件加载数据
void free_library(LibrarySystem *lib);                                  // 释放图书馆系统内存
void print_all_books(LibrarySystem *lib);                               //打印所有书籍记录
void print_all_readers(LibrarySystem *lib);                             //打印所有读者记录
void print_all_records(LibrarySystem *lib);                             // 打印所有借阅记录
void display_menu();                                                    //主菜单


// 辅助函数
char* status_to_string(BookStatus status);
BookStatus string_to_status(const char *str);
void print_book_info(Book *book);
void print_reader_info(Reader *reader);
void print_record_info(BorrowRecord *record);
void trim_string(char *str);
time_t add_days(time_t date, int days);
void generate_record_id(char *buffer, size_t size);
//(4)函数定义




//(5)宏定义





//(6)全局静态变量定义


















#endif